Differences across fieldsites

Mean subscale scores by site

First, let’s take the 5 a priori subscales we posited and look at the average scores for participants in each site:

Some surprising things come out of this:

  • US participants scored higher in “dualism”, on average, than other participants in nearly every subscale. This is the opposite of what we might predict.
  • GH and VT participants - who were the most likely to be devout Christians, given our samples - scored quite low in “dualism” across the board, even in the more spiritual kinds of “dualism” that were captured by the “Life events” and “Minds, selves, & world” subscales.

Let’s look at these differences in more detail using the “raw data” for individual questions, rather than these subscale scores. (After all, these subscales have never been validated! This is one of the very first times we’ve tried this scale.)

Responses by question, by site

There are two ways we might want to look at the “raw data” here: after reverse-coding (which allows us to see how “dualist” vs. “materialist” participants’ responses were in each site) and before reverse-coding (which allows to to see how often people circled “I agree” vs. “I do not agree”). These are 100% redundant, but for some purposes one might be more intuitive than the other.

AFTER reverse-coding

First, let’s look at responses the way they were intended to be looked at - i.e., after reverse-coding items. Here, we focus on the percentage of people who gave the more “dualist” (i.e., less “materialist”) response to each question:

Joining, by = "question"
Column `question` joining character vector and factor, coercing into character vector

BEFORE reverse-coding

Now, let’s look at responses the way the participants saw them - i.e., before reverse-coding items. Here, we focus on the percentage of people who circled “I agree” for each question:

attributes are not identical across measure variables;
they will be droppedJoining, by = "question"
Column `question` joining character vector and factor, coercing into character vector

Either way we look at it, a few weird things jump out. Just to highlight a few that John and I noticed:

  • Only 75% of GH participants circled “I agree” to the item “I believe in something like a soul or a spirit” (in the “Minds, selves, & world” subscale). This is lower than the US!
  • 56% of GH participants circled “I agree” to the item “Even though some people believe in souls or spirits, there is really no such thing” (also in the “Minds, selves, & world” subscale). This seems really off, and it’s very inconsistent with the “I believe in something like a soul or a spirit” item, above.
  • 55% of GH participants and 43% of VT participants cirlced “I agree” to the item “There is no such thing as an afterlife” (in the “Live events” subscale). This is lower than I’d predict among devout Christians.

Many of these questions seem to have been particularly problematic in Ghana, though it could be useful to get other perspectives on the responses from each site.

Scale structure

Another kind of question you could ask is how the different questions were correlated with each other, both overall and within each site.

Overall

Joining, by = "question"
Column `question` joining character vector and factor, coercing into character vector

By site

US alone

Joining, by = "question"
Column `question` joining character vector and factor, coercing into character vector

Ghana alone

Joining, by = "question"
Column `question` joining character vector and factor, coercing into character vector

Thailand alone

Joining, by = "question"
Column `question` joining character vector and factor, coercing into character vector

Vanuatu alone

Joining, by = "question"
Column `question` joining character vector and factor, coercing into character vector

LS0tCnRpdGxlOiAnR3JhcHBsaW5nIHdpdGggdGhlICJEdWFsaXNtIiBzY2FsZScKc3VidGl0bGU6ICdMYXN0IHVwZGF0ZWQgMjAxOC0wNC0wNScKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKYGBge3IsIGluY2x1ZGUgPSBGQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9CiMgc2V0IHdvcmtpbmcgZGlyZWN0b3IKIyBzZXR3ZCgiL1VzZXJzL2t3ZWlzbWFuL0RvY3VtZW50cy9SZXNlYXJjaCAoU3RhbmZvcmQpL1Byb2plY3RzL1RlbXBsZXRvbiBHcmFudC9EQVRBIFdSQU5HTElORy90ZW1wbGV0b25fcGFja2V0cy9wYWNrZXRzMTIzLyIpCgojIGxvYWQgcGFja2FnZXMKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocm1zKQpsaWJyYXJ5KGdnZGVuZHJvKQpsaWJyYXJ5KHBzeWNoKQoKIyBsb2FkIHF1ZXN0aW9uIGtleSAoaW5jbHVkaW5nIG1hbnVhbCByZXZlcnNlLWNvZGluZykKcXVlc3Rpb25fa2V5IDwtIHJlYWQuY3N2KCIvL1VzZXJzL2t3ZWlzbWFuL0RvY3VtZW50cy9SZXNlYXJjaCAoU3RhbmZvcmQpL1Byb2plY3RzL1RlbXBsZXRvbiBHcmFudC9EQVRBIFdSQU5HTElORy90ZW1wbGV0b25fcGFja2V0cy9wYWNrZXRzMTIzL3BhY2tldHMxMjNfcXVlc3Rpb25fa2V5X2J5aGFuZC5jc3YiKQoKIyBsb2FkIGRhdGEgKHJldmVyc2UtY29kZWQpCmRfbG9uZyA8LSByZWFkX2NzdigiLy9Vc2Vycy9rd2Vpc21hbi9Eb2N1bWVudHMvUmVzZWFyY2ggKFN0YW5mb3JkKS9Qcm9qZWN0cy9UZW1wbGV0b24gR3JhbnQvREFUQSBXUkFOR0xJTkcvdGVtcGxldG9uX3BhY2tldHMvcGFja2V0czEyMy9wYWNrZXRzMTIzX2RhdGFfYnlxdWVzdGlvbl9sb25nLmNzdiIpICU+JQogIG11dGF0ZShjdHJ5ID0gZmFjdG9yKGN0cnksIAogICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInVzIiwgImdoYW5hIiwgInRoYWlsYW5kIiwgImNoaW5hIiwgInZhbnVhdHUiKSkpCmRfbG9uZ19zdWJzY2FsZSA8LSByZWFkX2NzdigiLy9Vc2Vycy9rd2Vpc21hbi9Eb2N1bWVudHMvUmVzZWFyY2ggKFN0YW5mb3JkKS9Qcm9qZWN0cy9UZW1wbGV0b24gR3JhbnQvREFUQSBXUkFOR0xJTkcvdGVtcGxldG9uX3BhY2tldHMvcGFja2V0czEyMy9wYWNrZXRzMTIzX2RhdGFfYnlzdWJzY2FsZV9sb25nLmNzdiIpICU+JQogIG11dGF0ZShjdHJ5ID0gZmFjdG9yKGN0cnksIAogICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInVzIiwgImdoYW5hIiwgInRoYWlsYW5kIiwgImNoaW5hIiwgInZhbnVhdHUiKSkpCgojIGxvYWQgZGF0YSAoYmVmb3JlIHJldmVyc2UtY29kaW5nKQpkX2FsbCA8LSByZWFkLmNzdigiLy9Vc2Vycy9rd2Vpc21hbi9Eb2N1bWVudHMvUmVzZWFyY2ggKFN0YW5mb3JkKS9Qcm9qZWN0cy9UZW1wbGV0b24gR3JhbnQvREFUQSBXUkFOR0xJTkcvdGVtcGxldG9uX3BhY2tldHMvcGFja2V0czEyMy9wYWNrZXRzMTIzX2RhdGEuY3N2IikKCiMgbWFrZSBjdXN0b20gZnVuY3Rpb25zCnJvdW5kMiA8LSBmdW5jdGlvbih4KSB7Zm9ybWF0KHJvdW5kKHgsIDIpLCBkaWdpdHMgPSAyKX0KYGBgCgojIERpZmZlcmVuY2VzIGFjcm9zcyBmaWVsZHNpdGVzCgojIyBNZWFuIHN1YnNjYWxlIHNjb3JlcyBieSBzaXRlCgpGaXJzdCwgbGV0J3MgdGFrZSB0aGUgNSBhIHByaW9yaSBzdWJzY2FsZXMgd2UgcG9zaXRlZCBhbmQgbG9vayBhdCB0aGUgYXZlcmFnZSBzY29yZXMgZm9yIHBhcnRpY2lwYW50cyBpbiBlYWNoIHNpdGU6CgpgYGB7ciwgaW5jbHVkZSA9IEZ9CmRfbG9uZ19zdWJzY2FsZV9ib290IDwtIGRfbG9uZ19zdWJzY2FsZSAlPiUKICBmaWx0ZXIoIWlzLm5hKHN1bV9zY29yZSkpICU+JQogIGdyb3VwX2J5KGN0cnksIHBhY2tldCwgc3Vic2NhbGUpICU+JQogIGRvKGRhdGEuZnJhbWUocmJpbmQoc21lYW4uY2wuYm9vdCguJHN1bV9zY29yZSkpKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGZpbHRlcihzdWJzY2FsZSAhPSAiYXR0biIpICU+JQogIGxlZnRfam9pbihkX2xvbmdfc3Vic2NhbGUgJT4lCiAgICAgICAgICAgICAgZmlsdGVyKCFpcy5uYShzdW1fc2NvcmUpKSAlPiUKICAgICAgICAgICAgICBjb3VudChjdHJ5LCBwYWNrZXQsIHN1YnNjYWxlKSkgJT4lCiAgbXV0YXRlKHBhY2tldCA9IHBhc3RlKCJwYWNrZXQiLCBwYWNrZXQpLAogICAgICAgICBjdHJ5ID0gZmFjdG9yKGN0cnksCiAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygidXMiLCAiZ2hhbmEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGFpbGFuZCIsICJjaGluYSIsICJ2YW51YXR1IikpLAogICAgICAgICBzdWJzY2FsZSA9IAogICAgICAgICAgIGZhY3RvcihzdWJzY2FsZSwKICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiZXh3bCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHdsX2V4dHJhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHNlXzF0bzQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHNlXzV0bzE0IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRzZV81dG8xNF90aGFpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHNlXzE1dG8xNiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkc2VfMTV0bzE2X3RoYWkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGV2IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbl9zZW5zb3J5X3NlZWtpbmciLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VuX2JvZHlfYXdhcmVuZXNzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbl90cmFpdF9tZXRhbW9vZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhlcjJfaGFsbHVjaW5hdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludm9fVklTUV9kaWFsb2dpY19zcGVlY2giLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52b19WSVNRX2lubmVyX3NwZWVjaCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludm9fVklTUV9ldmFsX21vdGl2X2lubmVyX3NwZWVjaCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludm9faGFyZHlfYmVudGFsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhlcl9wb3NleV9sb3NjaCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuY29fbGV3aWNraSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGFfdmFuX2VsayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhdF9jb25maWRlbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGF0X3Bvc2l0aXZlX2JlbGllZnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXRfY29nbml0aXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGF0X3VuY29udHJvbGxhYmlsaXR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGF0X25lZWRfY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pbndfbWVudGFsX3N0YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pbndfbGlmZV9ldmVudHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaW53X2luYW5pbWF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pbndfc2VsdmVzX3NvdWxzX3dvcmxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWlud19lcGlzdGVtaWMiKSwKICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiYWJzb3JwdGlvbiAodGVsbGVnZW4pIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFic29ycHRpb24gKGV4dHJhKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhaWx5IHNwaXJpdHVhbCBleHBlcmllbmNlcyAoIzEtNCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYWlseSBzcGlyaXR1YWwgZXhwZXJpZW5jZXMgKCM1LTE0KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhaWx5IHNwaXJpdHVhbCBleHBlcmllbmNlcyAoIzUtMTQgdGhhaSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYWlseSBzcGlyaXR1YWwgZXhwZXJpZW5jZXMgKCMxNS0xNikiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYWlseSBzcGlyaXR1YWwgZXhwZXJpZW5jZXMgKCMxNS0xNiB0aGFpKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwaXJpdHVhbCBldmVudHMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2Vuc29yeSBzZWVraW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYm9keSBhd2FyZW5lc3MiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXR0ZW50aW9uIHRvIGZlZWxpbmdzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFsbHVjaW5hdGlvbiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWSVNROiBkaWFsb2dpYyBzcGVlY2giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWSVNROiBpbm5lciBzcGVlY2giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWSVNROiBldmFsdWF0aXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5uZXIgc3BlZWNoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVhcmluZyBldmVudHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmNvZGluZyBzdHlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pbmQgbWV0YXBob3JzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0YWNvZy46IGxhY2sgb2YgY29nbml0aXZlIGNvbmZpZGVuY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXRhY29nLjogcG9zaXRpdmUgYmVsaWVmcyByZTogd29ycnlpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXRhY29nLjogY29nbml0aXZlIHNlbGYtY29uc2Npb3VzbmVzcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGFjb2cuOiB1bmNvbnRyb2xsYWJpbGl0eS9kYW5nZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXRhY29nLjogbmVlZCB0byBjb250cm9sIHRob3VnaHRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHVhbGlzbTogbWVudGFsIHN0YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImR1YWxpc206IGxpZmUgZXZlbnRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHVhbGlzbTogaW5hbmltYXRlIGNvbnNjaW91c25lc3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkdWFsaXNtOiBtaW5kcywgc2VsdmVzLCAmIHdvcmxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHVhbGlzbTogZXBpc3RlbW9sb2d5IikpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC42fQpnZ3Bsb3QoZF9sb25nX3N1YnNjYWxlX2Jvb3QgJT4lCiAgICAgICAgIGZpbHRlcihncmVwbCgiZHVhbGlzbSIsIHN1YnNjYWxlKSkgJT4lCiAgICAgICAgIG11dGF0ZShzdWJzY2FsZSA9IAogICAgICAgICAgICAgICAgICBmYWN0b3Ioc3Vic2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiRHVhbGlzbTogTWVudGFsIHN0YXRlc1xucmFuZ2U6IDAgdG8gOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkR1YWxpc206IExpZmUgZXZlbnRzXG5yYW5nZTogMCB0byA1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHVhbGlzbTogSW5hbmltYXRlIGNvbnNjaW91c25lc3NcbnJhbmdlOiAwIHRvIDYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEdWFsaXNtOiBNaW5kcywgc2VsdmVzLCAmIHdvcmxkXG5yYW5nZTogMCB0byA5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHVhbGlzbTogRXBpc3RlbW9sb2d5XG5yYW5nZTogMCB0byA1IikpKSAlPiUKICAgICAgICAgbXV0YXRlKHBhY2tldCA9IGdzdWIoInBhY2tldCAiLCAiUCIsIHBhY2tldCksCiAgICAgICAgICAgICAgICBtYXggPSBjYXNlX3doZW4oCiAgICAgICAgICAgICAgICAgIGdyZXBsKCJtZW50YWwgc3RhdGVzIiwgdG9sb3dlcihzdWJzY2FsZSkpIH4gOCwKICAgICAgICAgICAgICAgICAgZ3JlcGwoImxpZmUgZXZlbnRzIiwgdG9sb3dlcihzdWJzY2FsZSkpIH4gNSwKICAgICAgICAgICAgICAgICAgZ3JlcGwoImluYW5pbWF0ZSIsIHRvbG93ZXIoc3Vic2NhbGUpKSB+IDYsCiAgICAgICAgICAgICAgICAgIGdyZXBsKCJtaW5kcyIsIHRvbG93ZXIoc3Vic2NhbGUpKSB+IDksCiAgICAgICAgICAgICAgICAgIGdyZXBsKCJlcGlzdGVtIiwgdG9sb3dlcihzdWJzY2FsZSkpIH4gNSkpLAogICAgICAgYWVzKHggPSBjdHJ5LCB5ID0gTWVhbiwgY29sb3IgPSBjdHJ5KSkgKwogIGZhY2V0X3dyYXAofiByZW9yZGVyKGludGVyYWN0aW9uKHBhY2tldCwgc3Vic2NhbGUsIHNlcCA9ICI6ICIpLAogICAgICAgICAgICAgICAgICAgICAgIGFzLm51bWVyaWMoZmFjdG9yKHBhY2tldCkpKSwKICAgICAgICAgICAgIG5jb2wgPSA1LCBzY2FsZXMgPSAiZml4ZWQiKSArCiAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdCA9IDApLCBsdHkgPSAyLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0ID0gbWF4KSwgbHR5ID0gMiwgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gTG93ZXIsIHltYXggPSBVcHBlcikpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGFzdGUwKCIobj0iLCBuLCAiKSIpLCB5ID0gTG93ZXIpLCAKICAgICAgICAgICAgc2l6ZSA9IDIsIG51ZGdlX3ggPSAwLjE1LCBoanVzdCA9IDApICsKICBzY2FsZV94X2Rpc2NyZXRlKGV4cGFuZCA9IGMoMCwgMSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCA5KSwgYnJlYWtzID0gMDo5KSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGxhYnModGl0bGUgPSAiTWVhbiBzdWJzY2FsZSBzY29yZXMgYnkgc2l0ZSIsCiAgICAgICBzdWJ0aXRsZSA9ICJBIGhpZ2hlciBzY29yZSBpbmRpY2F0ZXMgbW9yZSAnZHVhbGlzdCcgcmF0aGVyIHRoYW4gJ21hdGVyaWFsaXN0JyByZXBvbnNlc1xuTWluLiBhbmQgbWF4LiBzY29yZSBmb3IgZWFjaCBzdWJzY2FsZSBhcmUgZGVtYXJjYXRlZCBieSB0aGUgZG90dGVkIGxpbmVzXG5FcnJvciBiYXJzIGFyZSBib290c3RyYXBwZWQgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIiwKICAgICAgIHggPSAiU2l0ZSIsIGNvbG9yID0gIlNpdGUiLAogICAgICAgeSA9ICJNZWFuIHN1YnNjYWxlIHNjb3JlIChyYW5nZSB2YXJpZXMgYnkgc3Vic2NhbGUpIikKYGBgCgpTb21lIHN1cnByaXNpbmcgdGhpbmdzIGNvbWUgb3V0IG9mIHRoaXM6CgotIFVTIHBhcnRpY2lwYW50cyBzY29yZWQgaGlnaGVyIGluICJkdWFsaXNtIiwgb24gYXZlcmFnZSwgdGhhbiBvdGhlciBwYXJ0aWNpcGFudHMgaW4gbmVhcmx5IGV2ZXJ5IHN1YnNjYWxlLiBUaGlzIGlzIHRoZSBvcHBvc2l0ZSBvZiB3aGF0IHdlIG1pZ2h0IHByZWRpY3QuCi0gR0ggYW5kIFZUIHBhcnRpY2lwYW50cyAtIHdobyB3ZXJlIHRoZSBtb3N0IGxpa2VseSB0byBiZSBkZXZvdXQgQ2hyaXN0aWFucywgZ2l2ZW4gb3VyIHNhbXBsZXMgLSBzY29yZWQgcXVpdGUgbG93IGluICJkdWFsaXNtIiBhY3Jvc3MgdGhlIGJvYXJkLCBldmVuIGluIHRoZSBtb3JlIHNwaXJpdHVhbCBraW5kcyBvZiAiZHVhbGlzbSIgdGhhdCB3ZXJlIGNhcHR1cmVkIGJ5IHRoZSAiTGlmZSBldmVudHMiIGFuZCAiTWluZHMsIHNlbHZlcywgJiB3b3JsZCIgc3Vic2NhbGVzLgoKTGV0J3MgbG9vayBhdCB0aGVzZSBkaWZmZXJlbmNlcyBpbiBtb3JlIGRldGFpbCB1c2luZyB0aGUgInJhdyBkYXRhIiBmb3IgaW5kaXZpZHVhbCBxdWVzdGlvbnMsIHJhdGhlciB0aGFuIHRoZXNlIHN1YnNjYWxlIHNjb3Jlcy4gKEFmdGVyIGFsbCwgdGhlc2Ugc3Vic2NhbGVzIGhhdmUgbmV2ZXIgYmVlbiB2YWxpZGF0ZWQhIFRoaXMgaXMgb25lIG9mIHRoZSB2ZXJ5IGZpcnN0IHRpbWVzIHdlJ3ZlIHRyaWVkIHRoaXMgc2NhbGUuKQoKIyMgUmVzcG9uc2VzIGJ5IHF1ZXN0aW9uLCBieSBzaXRlCgpUaGVyZSBhcmUgdHdvIHdheXMgd2UgbWlnaHQgd2FudCB0byBsb29rIGF0IHRoZSAicmF3IGRhdGEiIGhlcmU6IGFmdGVyIHJldmVyc2UtY29kaW5nICh3aGljaCBhbGxvd3MgdXMgdG8gc2VlIGhvdyAiZHVhbGlzdCIgdnMuICJtYXRlcmlhbGlzdCIgcGFydGljaXBhbnRzJyByZXNwb25zZXMgd2VyZSBpbiBlYWNoIHNpdGUpIGFuZCBiZWZvcmUgcmV2ZXJzZS1jb2RpbmcgKHdoaWNoIGFsbG93cyB0byB0byBzZWUgaG93IG9mdGVuIHBlb3BsZSBjaXJjbGVkICJJIGFncmVlIiB2cy4gIkkgZG8gbm90IGFncmVlIikuIFRoZXNlIGFyZSAxMDAlIHJlZHVuZGFudCwgYnV0IGZvciBzb21lIHB1cnBvc2VzIG9uZSBtaWdodCBiZSBtb3JlIGludHVpdGl2ZSB0aGFuIHRoZSBvdGhlci4KCiMjIyBBRlRFUiByZXZlcnNlLWNvZGluZwoKRmlyc3QsIGxldCdzIGxvb2sgYXQgcmVzcG9uc2VzIHRoZSB3YXkgdGhleSB3ZXJlIGludGVuZGVkIHRvIGJlIGxvb2tlZCBhdCAtIGkuZS4sICoqYWZ0ZXIqKiByZXZlcnNlLWNvZGluZyBpdGVtcy4gSGVyZSwgd2UgZm9jdXMgb24gdGhlIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdobyBnYXZlIHRoZSBtb3JlICJkdWFsaXN0IiAoaS5lLiwgbGVzcyAibWF0ZXJpYWxpc3QiKSByZXNwb25zZSB0byBlYWNoIHF1ZXN0aW9uOgoKYGBge3IsIGZpZy53aWR0aCA9IDgsIGZpZy5hc3AgPSAwLjZ9CmRfbG9uZyAlPiUKICBmaWx0ZXIoZ3JlcGwoIm1pbndfIiwgcXVlc3Rpb24pLAogICAgICAgICAjIGN0cnkgJWluJSBjKCJnaGFuYSIsICJ1cyIpLAogICAgICAgICAhZ3JlcGwoImF0dG4iLCBxdWVzdGlvbiksCiAgICAgICAgICFpcy5uYShyZXNwb25zZSkpICU+JQogIGxlZnRfam9pbihxdWVzdGlvbl9rZXkgJT4lCiAgICAgICAgICAgICAgZGlzdGluY3QocXVlc3Rpb25fbGFiZWxfdW5pdmVyc2FsLCAKICAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbl90ZXh0LAogICAgICAgICAgICAgICAgICAgICAgIGJ5aGFuZF9jb2RpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgYnloYW5kX3N1YnNjYWxlKSAlPiUKICAgICAgICAgICAgICByZW5hbWUocXVlc3Rpb24gPSBxdWVzdGlvbl9sYWJlbF91bml2ZXJzYWwsCiAgICAgICAgICAgICAgICAgICAgIGNvZGluZyA9IGJ5aGFuZF9jb2RpbmcsCiAgICAgICAgICAgICAgICAgICAgIHN1YnNjYWxlID0gYnloYW5kX3N1YnNjYWxlKSkgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBtdXRhdGUocmVzcG9uc2UgPSBmYWN0b3IocmVzcG9uc2UsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKDAsIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCInTWF0ZXJpYWxpc3QnIiwgIidEdWFsaXN0JyIpKSwKICAgICAgICAgY29kaW5nID0gZmFjdG9yKGNvZGluZywKICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIi0xIiwgIjEiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIihSRVZFUlNFRCkiLCAiIikpLAogICAgICAgICBxdWVzdGlvbl90ZXh0X3Nob3J0ID0gcGFzdGUwKHN1YnN0cihxdWVzdGlvbl90ZXh0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAxLCBzdG9wID0gMTAwMCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIi4uLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kaW5nKSwKICAgICAgICAgc3Vic2NhbGUgPSBmYWN0b3Ioc3Vic2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkVwaXN0ZW1vbG9neSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluYW5pbWF0ZSBiZWluZ3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMaWZlIGV2ZW50cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lbnRhbCBzdGF0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaW5kcywgc2VsdmVzLCAmIHdvcmxkIikpKSAlPiUKICBjb3VudChjdHJ5LCBzdWJzY2FsZSwgcXVlc3Rpb25fdGV4dF9zaG9ydCwgcmVzcG9uc2UpICU+JQogIHNwcmVhZChyZXNwb25zZSwgbikgJT4lCiAgYXJyYW5nZShzdWJzY2FsZSwgY3RyeSwgZGVzYyhgJ0R1YWxpc3QnYCkpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigib3JkZXIiKSAlPiUKICBtdXRhdGUob3JkZXIgPSBhcy5udW1lcmljKG9yZGVyKSwKICAgICAgICAgdG90YWxfbiA9IGAnTWF0ZXJpYWxpc3QnYCArIGAnRHVhbGlzdCdgKSAlPiUKICBnYXRoZXIocmVzcG9uc2UsIG4sIGMoYCdNYXRlcmlhbGlzdCdgLCBgJ0R1YWxpc3QnYCkpICU+JQogIG11dGF0ZShyZXNwb25zZSA9IGZhY3RvcihyZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiJ01hdGVyaWFsaXN0JyIsICInRHVhbGlzdCciKSksCiAgICAgICAgIGN0cnkgPSBmYWN0b3IoY3RyeSwKICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ1cyIsICJnaGFuYSIsICJ0aGFpbGFuZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoaW5hIiwgInZhbnVhdHUiKSwKICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJVUyIsICJHaGFuYSIsICJUaGFpbGFuZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoaW5hIiwgIlZhbnVhdHUiKSkpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihxdWVzdGlvbl90ZXh0X3Nob3J0LCBkZXNjKG9yZGVyKSksIAogICAgICAgICAgICAgeSA9IG4sIGZpbGwgPSByZXNwb25zZSkpICsKICBmYWNldF9ncmlkKHN1YnNjYWxlIH4gY3RyeSwgc2NhbGVzID0gImZyZWUiLCBzcGFjZSA9ICJmcmVlIikgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2soKSwgc3RhdCA9ICJpZGVudGl0eSIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGFzdGUwKHJvdW5kKG4vdG90YWxfbiwgMikqMTAwLCAiJSIpLCAKICAgICAgICAgICAgICAgIGFscGhhID0gcmVzcG9uc2UpLCBzaXplID0gMykgKwogIHNjYWxlX2FscGhhX2Rpc2NyZXRlKGd1aWRlID0gIm5vbmUiLCByYW5nZSA9IGMoMCwgMSkpICsKICB0aGVtZV9idygpICsKICBsYWJzKHRpdGxlID0gIlJlc3BvbnNlcyB0byAnRHVhbGlzbScgc2NhbGUgaXRlbXMiLAogICAgICAgc3VidGl0bGUgPSAiJSBjb3JyZXNwb25kcyB0byB0aG9zZSBnaXZpbmcgdGhlIG1vcmUgJ2R1YWxpc3QnIHJlc3BvbnNlLCBhZnRlciByZXZlcnNlIGNvZGluZyIsCiAgICAgICB4ID0gIiIsIHkgPSAiQ291bnQgb2YgcmVzcG9uc2VzIiwgZmlsbCA9ICJUeXBlIG9mIHJlc3BvbnNlIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLAogICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArCiAgIyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKQogIGNvb3JkX2ZsaXAoKQpgYGAKCgojIyBCRUZPUkUgcmV2ZXJzZS1jb2RpbmcKCk5vdywgbGV0J3MgbG9vayBhdCByZXNwb25zZXMgdGhlIHdheSB0aGUgcGFydGljaXBhbnRzIHNhdyB0aGVtIC0gaS5lLiwgKipiZWZvcmUqKiByZXZlcnNlLWNvZGluZyBpdGVtcy4gSGVyZSwgd2UgZm9jdXMgb24gdGhlIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdobyBjaXJjbGVkICJJIGFncmVlIiBmb3IgZWFjaCBxdWVzdGlvbjoKCmBgYHtyLCBmaWcud2lkdGggPSA4LCBmaWcuYXNwID0gMC42fQpkX2FsbCAlPiUKICBzZWxlY3Qoc3ViaiwgY3RyeSwgc3RhcnRzX3dpdGgoIm1pbndfIikpICU+JQogIGdhdGhlcihxdWVzdGlvbiwgcmVzcG9uc2UsIHN0YXJ0c193aXRoKCJtaW53XyIpKSAlPiUKICBmaWx0ZXIoZ3JlcGwoIm1pbndfIiwgcXVlc3Rpb24pLAogICAgICAgICAjIGN0cnkgJWluJSBjKCJnaGFuYSIsICJ1cyIpLAogICAgICAgICAhZ3JlcGwoImF0dG4iLCBxdWVzdGlvbiksCiAgICAgICAgICFpcy5uYShyZXNwb25zZSkpICU+JQogIGxlZnRfam9pbihxdWVzdGlvbl9rZXkgJT4lCiAgICAgICAgICAgICAgZGlzdGluY3QocXVlc3Rpb25fbGFiZWxfdW5pdmVyc2FsLCAKICAgICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbl90ZXh0LAogICAgICAgICAgICAgICAgICAgICAgIGJ5aGFuZF9jb2RpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgYnloYW5kX3N1YnNjYWxlKSAlPiUKICAgICAgICAgICAgICByZW5hbWUocXVlc3Rpb24gPSBxdWVzdGlvbl9sYWJlbF91bml2ZXJzYWwsCiAgICAgICAgICAgICAgICAgICAgIGNvZGluZyA9IGJ5aGFuZF9jb2RpbmcsCiAgICAgICAgICAgICAgICAgICAgIHN1YnNjYWxlID0gYnloYW5kX3N1YnNjYWxlKSkgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBtdXRhdGUoIyByZXNwb25zZSA9IGZhY3RvcihyZXNwb25zZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbGV2ZWxzID0gYygwLCAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsYWJlbHMgPSBjKCInTWF0ZXJpYWxpc3QnIiwgIidEdWFsaXN0JyIpKSwKICAgICAgICAgY29kaW5nID0gZmFjdG9yKGNvZGluZywKICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIi0xIiwgIjEiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIihSRVZFUlNFRCkiLCAiIikpLAogICAgICAgICBxdWVzdGlvbl90ZXh0X3Nob3J0ID0gcGFzdGUwKHN1YnN0cihxdWVzdGlvbl90ZXh0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAxLCBzdG9wID0gMTAwMCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIi4uLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kaW5nKSwKICAgICAgICAgc3Vic2NhbGUgPSBmYWN0b3Ioc3Vic2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkVwaXN0ZW1vbG9neSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluYW5pbWF0ZSBiZWluZ3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMaWZlIGV2ZW50cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lbnRhbCBzdGF0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaW5kcywgc2VsdmVzLCAmIHdvcmxkIikpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHN1YnNjYWxlKSkgJT4lCiAgY291bnQoY3RyeSwgc3Vic2NhbGUsIGNvZGluZywgcXVlc3Rpb25fdGV4dF9zaG9ydCwgcmVzcG9uc2UpICU+JQogIHNwcmVhZChyZXNwb25zZSwgbikgJT4lCiAgYXJyYW5nZShzdWJzY2FsZSwgY3RyeSwgZGVzYyhgaSBhZ3JlZWApKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oIm9yZGVyIikgJT4lCiAgbXV0YXRlKG9yZGVyID0gYXMubnVtZXJpYyhvcmRlciksCiAgICAgICAgIHRvdGFsX24gPSBgaSBkbyBub3QgYWdyZWVgICsgYGkgYWdyZWVgKSAlPiUKICBnYXRoZXIocmVzcG9uc2UsIG4sIGMoYGkgZG8gbm90IGFncmVlYCwgYGkgYWdyZWVgKSkgJT4lCiAgbXV0YXRlKHJlc3BvbnNlID0gZmFjdG9yKHJlc3BvbnNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJpIGRvIG5vdCBhZ3JlZSIsICJpIGFncmVlIikpLAogICAgICAgICBjdHJ5ID0gZmFjdG9yKGN0cnksCiAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygidXMiLCAiZ2hhbmEiLCAidGhhaWxhbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGluYSIsICJ2YW51YXR1IiksCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiVVMiLCAiR2hhbmEiLCAiVGhhaWxhbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGluYSIsICJWYW51YXR1IikpLAogICAgICAgICBjb2RpbmcgPSBmYWN0b3IoY29kaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiIiwgIihSRVZFUlNFRCkiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIm5vcm1hbCIsICJyZXZlcnNlZCIpKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShzdWJzY2FsZSkpICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihxdWVzdGlvbl90ZXh0X3Nob3J0LCBkZXNjKG9yZGVyKSksIAogICAgICAgICAgICAgeSA9IG4sIGZpbGwgPSBjb2RpbmcsIGFscGhhID0gcmVzcG9uc2UpKSArCiAgZmFjZXRfZ3JpZChzdWJzY2FsZSB+IGN0cnksIHNjYWxlcyA9ICJmcmVlIiwgc3BhY2UgPSAiZnJlZSIpICsKICBnZW9tX2Jhcihwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKCksIHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlMChyb3VuZChuL3RvdGFsX24sIDIpKjEwMCwgIiUiKSwgCiAgICAgICAgICAgICAgICBhbHBoYSA9IHJlc3BvbnNlKSwgc2l6ZSA9IDMpICsKICBzY2FsZV9hbHBoYV9kaXNjcmV0ZShndWlkZSA9ICJub25lIiwgcmFuZ2UgPSBjKDAsIDEpKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQxIikgKwogIHRoZW1lX2J3KCkgKwogIGxhYnModGl0bGUgPSAiUmVzcG9uc2VzIHRvICdEdWFsaXNtJyBzY2FsZSBpdGVtcyIsCiAgICAgICBzdWJ0aXRsZSA9ICIlIGNvcnJlc3BvbmRzIHRvIHRob3NlIHdobyBzYXkgJ0kgYWdyZWUsJyBCRUZPUkUgcmV2ZXJzZS1jb2RpbmciLAogICAgICAgeCA9ICIiLCB5ID0gIkNvdW50IG9mIHJlc3BvbnNlcyIsIGZpbGwgPSAiVHlwZSBvZiBxdWVzdGlvbiIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwKICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogICMgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkKICBjb29yZF9mbGlwKCkKYGBgCgpFaXRoZXIgd2F5IHdlIGxvb2sgYXQgaXQsIGEgZmV3IHdlaXJkIHRoaW5ncyBqdW1wIG91dC4gSnVzdCB0byBoaWdobGlnaHQgYSBmZXcgdGhhdCBKb2huIGFuZCBJIG5vdGljZWQ6CgotIE9ubHkgNzUlIG9mIEdIIHBhcnRpY2lwYW50cyBjaXJjbGVkICJJIGFncmVlIiB0byB0aGUgaXRlbSAiSSBiZWxpZXZlIGluIHNvbWV0aGluZyBsaWtlIGEgc291bCBvciBhIHNwaXJpdCIgKGluIHRoZSAiTWluZHMsIHNlbHZlcywgJiB3b3JsZCIgc3Vic2NhbGUpLiBUaGlzIGlzIGxvd2VyIHRoYW4gdGhlIFVTIQotIDU2JSBvZiBHSCBwYXJ0aWNpcGFudHMgY2lyY2xlZCAiSSBhZ3JlZSIgdG8gdGhlIGl0ZW0gIkV2ZW4gdGhvdWdoIHNvbWUgcGVvcGxlIGJlbGlldmUgaW4gc291bHMgb3Igc3Bpcml0cywgdGhlcmUgaXMgcmVhbGx5IG5vIHN1Y2ggdGhpbmciIChhbHNvIGluIHRoZSAiTWluZHMsIHNlbHZlcywgJiB3b3JsZCIgc3Vic2NhbGUpLiBUaGlzIHNlZW1zIHJlYWxseSBvZmYsIGFuZCBpdCdzIHZlcnkgaW5jb25zaXN0ZW50IHdpdGggdGhlICJJIGJlbGlldmUgaW4gc29tZXRoaW5nIGxpa2UgYSBzb3VsIG9yIGEgc3Bpcml0IiBpdGVtLCBhYm92ZS4KLSA1NSUgb2YgR0ggcGFydGljaXBhbnRzIGFuZCA0MyUgb2YgVlQgcGFydGljaXBhbnRzIGNpcmxjZWQgIkkgYWdyZWUiIHRvIHRoZSBpdGVtICJUaGVyZSBpcyBubyBzdWNoIHRoaW5nIGFzIGFuIGFmdGVybGlmZSIgKGluIHRoZSAiTGl2ZSBldmVudHMiIHN1YnNjYWxlKS4gVGhpcyBpcyBsb3dlciB0aGFuIEknZCBwcmVkaWN0IGFtb25nIGRldm91dCBDaHJpc3RpYW5zLgoKTWFueSBvZiB0aGVzZSBxdWVzdGlvbnMgc2VlbSB0byBoYXZlIGJlZW4gcGFydGljdWxhcmx5IHByb2JsZW1hdGljIGluIEdoYW5hLCB0aG91Z2ggaXQgY291bGQgYmUgdXNlZnVsIHRvIGdldCBvdGhlciBwZXJzcGVjdGl2ZXMgb24gdGhlIHJlc3BvbnNlcyBmcm9tIGVhY2ggc2l0ZS4KCiMgU2NhbGUgc3RydWN0dXJlCgpBbm90aGVyIGtpbmQgb2YgcXVlc3Rpb24geW91IGNvdWxkIGFzayBpcyBob3cgdGhlIGRpZmZlcmVudCBxdWVzdGlvbnMgd2VyZSBjb3JyZWxhdGVkIHdpdGggZWFjaCBvdGhlciwgYm90aCBvdmVyYWxsIGFuZCB3aXRoaW4gZWFjaCBzaXRlLgoKIyMgT3ZlcmFsbAoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxfQpvdmVyYWxsIDwtIGRfbG9uZyAlPiUKICBmaWx0ZXIoZ3JlcGwoIm1pbndfIiwgcXVlc3Rpb24pLCAhZ3JlcGwoImF0dG4iLCBxdWVzdGlvbiksIAogICAgICAgICAhaXMubmEocmVzcG9uc2UpKSAlPiUKICBzZWxlY3Qoc3ViaiwgcXVlc3Rpb24sIHJlc3BvbnNlKSAlPiUKICBsZWZ0X2pvaW4ocXVlc3Rpb25fa2V5ICU+JSAKICAgICAgICAgICAgICBzZWxlY3QocXVlc3Rpb25fbGFiZWxfdW5pdmVyc2FsLCAKICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb25fdGV4dCwgYnloYW5kX3N1YnNjYWxlKSAlPiUgCiAgICAgICAgICAgICAgcmVuYW1lKHF1ZXN0aW9uID0gcXVlc3Rpb25fbGFiZWxfdW5pdmVyc2FsKSkgJT4lCiAgZGlzdGluY3Qoc3ViaiwgcXVlc3Rpb25fdGV4dCwgcmVzcG9uc2UpICU+JQogIHNwcmVhZChxdWVzdGlvbl90ZXh0LCByZXNwb25zZSkgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJlbW92ZV9yb3duYW1lcygpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygic3ViaiIpCgpvdmVyYWxsX2NsdXN0IDwtIGhjbHVzdChkaXN0KHQob3ZlcmFsbCkpKQpnZ2RlbmRyb2dyYW0ob3ZlcmFsbF9jbHVzdCwgcm90YXRlID0gVFJVRSkKYGBgCgojIyBCeSBzaXRlCgojIyMgVVMgYWxvbmUKCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMX0KdXMgPC0gZF9sb25nICU+JQogIGZpbHRlcihncmVwbCgibWlud18iLCBxdWVzdGlvbiksICFncmVwbCgiYXR0biIsIHF1ZXN0aW9uKSwgCiAgICAgICAgICFpcy5uYShyZXNwb25zZSksIGN0cnkgPT0gInVzIikgJT4lCiAgc2VsZWN0KHN1YmosIHF1ZXN0aW9uLCByZXNwb25zZSkgJT4lCiAgbGVmdF9qb2luKHF1ZXN0aW9uX2tleSAlPiUgCiAgICAgICAgICAgICAgc2VsZWN0KHF1ZXN0aW9uX2xhYmVsX3VuaXZlcnNhbCwgCiAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uX3RleHQsIGJ5aGFuZF9zdWJzY2FsZSkgJT4lIAogICAgICAgICAgICAgIHJlbmFtZShxdWVzdGlvbiA9IHF1ZXN0aW9uX2xhYmVsX3VuaXZlcnNhbCkpICU+JQogIGRpc3RpbmN0KHN1YmosIHF1ZXN0aW9uX3RleHQsIHJlc3BvbnNlKSAlPiUKICBzcHJlYWQocXVlc3Rpb25fdGV4dCwgcmVzcG9uc2UpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByZW1vdmVfcm93bmFtZXMoKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmoiKQoKdXNfY2x1c3QgPC0gaGNsdXN0KGRpc3QodCh1cykpKQpnZ2RlbmRyb2dyYW0odXNfY2x1c3QsIHJvdGF0ZSA9IFRSVUUpCmBgYAoKIyMjIEdoYW5hIGFsb25lCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDF9CmdoYW5hIDwtIGRfbG9uZyAlPiUKICBmaWx0ZXIoZ3JlcGwoIm1pbndfIiwgcXVlc3Rpb24pLCAhZ3JlcGwoImF0dG4iLCBxdWVzdGlvbiksIAogICAgICAgICAhaXMubmEocmVzcG9uc2UpLCBjdHJ5ID09ICJnaGFuYSIpICU+JQogIHNlbGVjdChzdWJqLCBxdWVzdGlvbiwgcmVzcG9uc2UpICU+JQogIGxlZnRfam9pbihxdWVzdGlvbl9rZXkgJT4lIAogICAgICAgICAgICAgIHNlbGVjdChxdWVzdGlvbl9sYWJlbF91bml2ZXJzYWwsIAogICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbl90ZXh0LCBieWhhbmRfc3Vic2NhbGUpICU+JSAKICAgICAgICAgICAgICByZW5hbWUocXVlc3Rpb24gPSBxdWVzdGlvbl9sYWJlbF91bml2ZXJzYWwpKSAlPiUKICBkaXN0aW5jdChzdWJqLCBxdWVzdGlvbl90ZXh0LCByZXNwb25zZSkgJT4lCiAgc3ByZWFkKHF1ZXN0aW9uX3RleHQsIHJlc3BvbnNlKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcmVtb3ZlX3Jvd25hbWVzKCkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJzdWJqIikKCmdoYW5hX2NsdXN0IDwtIGhjbHVzdChkaXN0KHQoZ2hhbmEpKSkKZ2dkZW5kcm9ncmFtKGdoYW5hX2NsdXN0LCByb3RhdGUgPSBUUlVFKQpgYGAKCgoKCiMjIyBUaGFpbGFuZCBhbG9uZQoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxfQp0aGFpbGFuZCA8LSBkX2xvbmcgJT4lCiAgZmlsdGVyKGdyZXBsKCJtaW53XyIsIHF1ZXN0aW9uKSwgIWdyZXBsKCJhdHRuIiwgcXVlc3Rpb24pLCAKICAgICAgICAgIWlzLm5hKHJlc3BvbnNlKSwgY3RyeSA9PSAidGhhaWxhbmQiKSAlPiUKICBzZWxlY3Qoc3ViaiwgcXVlc3Rpb24sIHJlc3BvbnNlKSAlPiUKICBsZWZ0X2pvaW4ocXVlc3Rpb25fa2V5ICU+JSAKICAgICAgICAgICAgICBzZWxlY3QocXVlc3Rpb25fbGFiZWxfdW5pdmVyc2FsLCAKICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb25fdGV4dCwgYnloYW5kX3N1YnNjYWxlKSAlPiUgCiAgICAgICAgICAgICAgcmVuYW1lKHF1ZXN0aW9uID0gcXVlc3Rpb25fbGFiZWxfdW5pdmVyc2FsKSkgJT4lCiAgZGlzdGluY3Qoc3ViaiwgcXVlc3Rpb25fdGV4dCwgcmVzcG9uc2UpICU+JQogIHNwcmVhZChxdWVzdGlvbl90ZXh0LCByZXNwb25zZSkgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJlbW92ZV9yb3duYW1lcygpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygic3ViaiIpCgp0aGFpbGFuZF9jbHVzdCA8LSBoY2x1c3QoZGlzdCh0KHRoYWlsYW5kKSkpCmdnZGVuZHJvZ3JhbSh0aGFpbGFuZF9jbHVzdCwgcm90YXRlID0gVFJVRSkKYGBgCgojIyMgVmFudWF0dSBhbG9uZQoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxfQp2YW51YXR1IDwtIGRfbG9uZyAlPiUKICBmaWx0ZXIoZ3JlcGwoIm1pbndfIiwgcXVlc3Rpb24pLCAhZ3JlcGwoImF0dG4iLCBxdWVzdGlvbiksIAogICAgICAgICAhaXMubmEocmVzcG9uc2UpLCBjdHJ5ID09ICJ2YW51YXR1IikgJT4lCiAgc2VsZWN0KHN1YmosIHF1ZXN0aW9uLCByZXNwb25zZSkgJT4lCiAgbGVmdF9qb2luKHF1ZXN0aW9uX2tleSAlPiUgCiAgICAgICAgICAgICAgc2VsZWN0KHF1ZXN0aW9uX2xhYmVsX3VuaXZlcnNhbCwgCiAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uX3RleHQsIGJ5aGFuZF9zdWJzY2FsZSkgJT4lIAogICAgICAgICAgICAgIHJlbmFtZShxdWVzdGlvbiA9IHF1ZXN0aW9uX2xhYmVsX3VuaXZlcnNhbCkpICU+JQogIGRpc3RpbmN0KHN1YmosIHF1ZXN0aW9uX3RleHQsIHJlc3BvbnNlKSAlPiUKICBzcHJlYWQocXVlc3Rpb25fdGV4dCwgcmVzcG9uc2UpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByZW1vdmVfcm93bmFtZXMoKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmoiKQoKdmFudWF0dV9jbHVzdCA8LSBoY2x1c3QoZGlzdCh0KHZhbnVhdHUpKSkKZ2dkZW5kcm9ncmFtKHZhbnVhdHVfY2x1c3QsIHJvdGF0ZSA9IFRSVUUpCmBgYAoKCgo=